package cn.bonoon.kernel.annotations.services;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

/**
 * 定义查询条件
 * 
 * <pre>
 * 1.问号和函数参数按顺序匹配。
 * e.g. 
 * @Where("x.id=? and x.deleted=?") // ql = "select x from PlaceEntity x where x.id=arg1 and x.deleted=arg2";
 * PlaceEntity getObject(Long arg1, Object arg2);
 * 
 * 2.当没有查询条件时，则不需要添加此注解。
 * e.g.
 * @Where("") // 错误，此行应去掉。则 ql = "select x from PlaceEntity x";
 * PlaceEntity getObject();
 * 
 * 3.当形参为 Object 时，实参必须为对象类型。
 * e.g.
 * 接口定义抽象函数 PlaceEntity getObject(Long arg1, Object arg2);
 * PlaceEntity pe = testAbstractService.getObject(-5L, 999);   // 错误，999 是 long
 * PlaceEntity pe = testAbstractService.getObject(-5L, 999L);  // 正确，999 是 Long
 * 
 * 4.当在 Mysql 下的 where 语句中存在 float/Float 类型数据判断相等时，请采用以下方法。(http://blog.csdn.net/ocean0815/article/details/29579685)
 * e.g.
 * @Where("ABS(x._float-?) < 1e-5") // 正确
 * @Where("x._float=?") // 错误，查找结果为null
 * </pre>
 * 
 * @author ocean~
 */
@Target(ElementType.METHOD)
@Retention(RUNTIME)
public @interface Where {
	/**
	 * 查询条件，问号和函数参数按顺序匹配 (e.g. "x.id=? and x.deleted=?")
	 */
	String value();
}
